package com.liyunhan.StrassenAlgorithm;


/**
 * @Description: 这个抽象类主要用于实现计算时间复杂度(模板类)
 * @Author: Liyunhan
 * @Date: 2021/11/15 21:27
 */
public abstract class CalExecTimeAbs {
    //矩阵大小(n)
    private int n;
    //矩阵1
    private double[][] matrix1;
    //矩阵2
    private double[][] matrix2;
    //(乘法)结果矩阵
    private double[][] resMatrix;

    /**
     * 仅提供含参构造方法, 要求必须传入矩阵大小n, 以及两个目标矩阵
     *
     * @param n
     * @param matrix1
     * @param matrix2
     */
    public CalExecTimeAbs(int n, double[][] matrix1, double[][] matrix2) {
        this.n = n;
        this.matrix1 = matrix1;
        this.matrix2 = matrix2;

        //初始化结果矩阵元素(全部初始化为0)
        this.resMatrix = new double[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                resMatrix[i][j] = 0.0;
            }
        }
    }

    /**
     * "算法计时器开始计时"
     * 拿到算法开始时钟时间
     *
     * @return
     */
    public final double getStartClock() {
        return System.currentTimeMillis();
    }

    /**
     * "算法计时器停止计时"
     * 拿到算法结束时钟时间
     *
     * @return
     */
    public final double getEndClock() {
        return System.currentTimeMillis();
    }

    /**
     * 抽象方法, 子类实现具体的矩阵乘法算法
     */
    public abstract void execAlgorithm();

    /**
     * 计算算法时间复杂度方法
     *
     * @return
     */
    public double start() {
        //算法计时器开始
        double start = getStartClock();
        //算法执行
        execAlgorithm();
        //算法计时器结束
        double end = getEndClock();

        //返回算法运行时间
        return end - start;
    }

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }

    public double[][] getMatrix1() {
        return matrix1;
    }

    public void setMatrix1(double[][] matrix1) {
        this.matrix1 = matrix1;
    }

    public double[][] getMatrix2() {
        return matrix2;
    }

    public void setMatrix2(double[][] matrix2) {
        this.matrix2 = matrix2;
    }

    public double[][] getResMatrix() {
        return resMatrix;
    }

}
